//给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 
//
// 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 
//
// 
//
// 示例 1: 
//
// 
//输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
//输出: [["bat"],["nat","tan"],["ate","eat","tea"]] 
//
// 示例 2: 
//
// 
//输入: strs = [""]
//输出: [[""]]
// 
//
// 示例 3: 
//
// 
//输入: strs = ["a"]
//输出: [["a"]] 
//
// 
//
// 提示： 
//
// 
// 1 <= strs.length <= 10⁴ 
// 0 <= strs[i].length <= 100 
// strs[i] 仅包含小写字母 
// 
//
// Related Topics 数组 哈希表 字符串 排序 👍 1909 👎 0


package LeetCode.editor.cn;

import java.util.*;

/**
 * @author ldltd
 * @date 2024-06-05 10:32:08
 * @description 49.字母异位词分组
 */
public class GroupAnagrams{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 GroupAnagrams fun=new GroupAnagrams();
	 	 Solution solution = fun.new Solution();

	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
	public List<List<String>> groupAnagrams(String[] strs) {
		Map<String, List<String>> map = new HashMap<>();
		for (String str : strs) {
			String s = str.chars()
					.sorted()
					.collect(StringBuffer::new, StringBuffer::appendCodePoint, StringBuffer::append)
					.toString();

				/*

				<R> R collect(
					Supplier<R> supplier,
					ObjIntConsumer<R> accumulator,
					BiConsumer<R, R> combiner
					)
					// 计算总和、计数、最大值、最小值
					int[] stats = IntStream.of(5, 2, 8, 1)
						.collect(() -> new int[4], // [sum, count, min, max]
								 (arr, value) -> {
									 arr[0] += value;    // sum
									 arr[1]++;           // count
									 arr[2] = Math.min(arr[2], value); // min
									 arr[3] = Math.max(arr[3], value); // max
								 },
								 (arr1, arr2) -> {
									 arr1[0] += arr2[0];
									 arr1[1] += arr2[1];
									 arr1[2] = Math.min(arr1[2], arr2[2]);
									 arr1[3] = Math.max(arr1[3], arr2[3]);
								 });
					// stats: [16, 4, 1, 8]
				// 简化写法1
				String s = str.chars()
					.sorted()
					.mapToObj(c -> String.valueOf((char) c))
					.collect(Collectors.joining());

				// 简化写法2（最推荐）
				String s = Arrays.stream(str.split(""))
					.sorted()
					.collect(Collectors.joining());

				// 简化写法3（性能最好）
				char[] chars = str.toCharArray();
				Arrays.sort(chars);
				String s = new String(chars);*/
			map.computeIfAbsent(String.valueOf(s.hashCode()), k -> new ArrayList<>()).add(str);
		}
		return new ArrayList<>(map.values());
	}
	/*别的写法*/
	public List<List<String>> groupAnagrams2(String[] strs) {
		Map<String, List<String>> map = new HashMap<String, List<String>>();
		for (String str : strs) {
			char[] array = str.toCharArray();
			Arrays.sort(array);
			String key = new String(array);
			List<String> list = map.getOrDefault(key, new ArrayList<String>());
			list.add(str);
			map.put(key, list);
		}
		return new ArrayList<List<String>>(map.values());
	}
}
//leetcode submit region end(Prohibit modification and deletion)

}
